## Gerar agregações: Cria agregações e representações gráficas com base nos dados da pesquisa
## Copyright (c) 2017, 2018 Adonay Felipe Nogueira <https://libreplanet.org/wiki/User:Adfeno>

## This program is free software: you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation, version 3 of the
## License.

## This program is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
## General Public License for more details.

## You should have received a copy of the GNU General Public License
## along with this program.  If not, see
## <https://www.gnu.org/licenses/>.

## Trata de grandes tabela de forma aprimorada.
library(data.table)

## Ferramentas relacionadas à imputação e verificação de valores
## nulos.
library(mice)
library(VIM)

## Carrega os dados.
dados <- read.csv("Dados.csv",
                  check.names = FALSE,
                  na.strings = "")

dados <- data.table(dados)

## Parte a dimensão "e".
outras_caracteristicas <-
    na.omit(unique(unlist(strsplit(as.character(dados[, e]),
                                   ","))))

## Parte as notas (para outras coisas além de "e").
notas <- c()

for (elemento in
     strsplit(na.omit(unique(unlist(strsplit(as.character(dados[, Notas]),
                                             ",")))),
              ": ")) {
    if (length(elemento) > 1) {
        notas <- append(notas,
                        elemento[[1]])}
    else {
                            notas <- append(notas,
                                            elemento)}}

notas <- unique(notas)

## Não mencionar outras características ou notas não anula a questão,
## por isso usamos 0 ao invés de NA.
dados[, (outras_caracteristicas) := 0]

dados[, (notas) := as.character(0)]

## Para cada menção destas, cria uma coluna e para cada respondente
## atribui o número 1 em tal coluna.
for (caracteristica in outras_caracteristicas) {
    dados[grep(caracteristica,
               dados[, e]), (caracteristica) := 1]}

for (nota in notas) {
    linhas <- grep(nota,
                   dados[, Notas])

    for (linha in linhas) {
        primeira_ocorrencia <-
            unlist(strsplit(grep(nota,
                                 unlist(strsplit(as.character(dados[linha,
                                                                    Notas]),
                                                 ",")),
                                 value = TRUE)[[1]],
                            ": "))

        if (length(primeira_ocorrencia) > 1) {
            dados[linha, (nota) :=
                             paste(toupper(substr(primeira_ocorrencia[[2]],
                                                  1,
                                                  1)),
                                   substring(primeira_ocorrencia[[2]],
                                             2),
                                   sep = "")]}
        else {
                                       dados[linha, (nota) :=
                                                        primeira_ocorrencia]}}}

## Prepara as colunas com comparações aprimoradas. O valor NA em
## alguma delas denota que pelo menos uma das variáveis em comparação
## estava nula.
combinacoes <- t(combn(rep(c(0,
                             1),
                           4),
                       4))
combinacoes <- combinacoes[which(apply(combinacoes,
                                       1,
                                       function(x) {
                                           !(list(x) %in%
                                             list(c(1,1,1,1)))})), ]
combinacoes <- lapply(seq_len(nrow(combinacoes)),
                      function(i) combinacoes[i, ])
dimensoes <- list(list("Definição de programas livres",
                       c(letters[1:4]),
                       list("Convergente",
                            list(c(1,
                                   1,
                                   1,
                                   1))),
                       list("Divergente",
                            combinacoes)),
                  list("Gestão universitária + Ensino-aprendizagem",
                       c(letters[6:7]),
                       list("Ambos",
                            list(c(1,
                                   1))),
                       list("Gestão",
                            list(c(1,
                                   0))),
                       list("Ensino",
                            list(c(0,
                                   1))),
                       list("Nenhum",
                            list(c(0,
                                   0)))),
                  list("Sustentabilidade + Economia local",
                       c(letters[8:9]),
                       list("Ambos",
                            list(c(1,
                                   1))),
                       list("Sustentabilidade",
                            list(c(1,
                                   0))),
                       list("Economia",
                            list(c(0,
                                   1))),
                       list("Nenhum",
                            list(c(0,
                                   0)))),
                  list("Competição + Colaboração",
                       c(letters[10:11]),
                       list("Ambos",
                            list(c(1,
                                   1))),
                       list("Competição",
                            list(c(1,
                                   0))),
                       list("Colaboração",
                            list(c(0,
                                   1))),
                       list("Nenhum",
                            list(c(0,
                                   0)))),
                  list("Compartilhamento digital + TCRSFDD",
                       c(letters[12:13]),
                       list("Ambos",
                            list(c(1,
                                   1))),
                       list("Compartilhamento",
                            list(c(1,
                                   0))),
                       list("TCRSFDD",
                            list(c(0,
                                   1))),
                       list("Nenhum",
                            list(c(0,
                                   0)))),
                  list("Intenção em contratos",
                       c(letters[14:15]),
                       list("Competitiva",
                            list(c(0,
                                   0))),
                       list("Igual ao tipo",
                            list(c(0,
                                   1))),
                       list("Inversa ao tipo",
                            list(c(1,
                                   0))),
                       list("Colaborativa",
                            list(c(1,
                                   1)))))
for (dimensao in dimensoes) {
    colunas <- dimensao[[2]]
    for (padrao in dimensao[- c(1, 2)]) {
        dados[which(apply(dados[, ..colunas],
                          1,
                          function(x) {
                              list(c(as.double(x))) %in%
                                  padrao[[2]]})), (dimensao[[1]]) :=
                                                      padrao[[1]]]}}

## Salva cada consulta em seu arquivo específico.
consultas_e_arquivos <-
    list(list("dados[, c(letters[1:4], letters[6:15]), with = FALSE]",
              "Dados primários.csv"),
         list("md.pattern(as.data.frame(dados)[, c(letters[1:4], letters[6:15])])",
              "Padrão das dimensões com observações de valores nulos.csv"),
         list("dados[, .N, by = c(letters[1:4])]",
              "Agregação a a d.csv"),
         list("dados[, .N, by = c(letters[6:7])]",
              "Agregação f e g.csv"),
         list("dados[, .N, by = c(letters[8:9])]",
              "Agregação h e i.csv"),
         list("dados[, .N, by = c(letters[10:11])]",
              "Agregação j e k.csv"),
         list("dados[, .N, by = c(letters[12:13])]",
              "Agregação l e m.csv"),
         list("dados[, .N, by = c(letters[14:15])]",
              "Agregação n e o.csv"),
         list("dados[, .N, by = c(names(dados)[c(17:(16 + length(outras_caracteristicas)))])]",
              "Agregação dos dados da dimensão e.csv"),
         list("dados[, .N, by = c(grep('^Compartilhamento digital$|^TCRSFDD$', names(dados), value = TRUE))]",
              "Agregação dos dados das notas sobre compartilhamento digital e TCRSFDD.csv"),
         list("dados[, .N, by = c(grep('^Contrato', names(dados), value = TRUE))]",
              "Agregação dos dados das notas sobre intenções de comportamento em contratos.csv"),
         list("dados[, .N, by = c(unlist(lapply(dimensoes, getElement, 1)))]",
              "Agregação aprimorada dos dados.csv"),
         list("dados[, .N, by = c(grep('^Definição', names(dados), value = TRUE), outras_caracteristicas)]",
              "Agregação aprimorada entre a definição de software livre e outras características.csv"),
         list("dados[, .N, by = c(grep('^Definição|^Gestão', names(dados), value = TRUE))]",
              "Agregação aprimorada entre a definição, gestão e ensino.csv"),
         list("dados[, .N, by = c(grep('^Definição|^Sustentabilidade', names(dados), value = TRUE))]",
              "Agregação aprimorada entre a definição, sustentabilidade e economia.csv"),
         list("dados[, .N, by = c(grep('[Cc]ontrato', names(dados), value = TRUE))]",
              "Agregação aprimorada entre as intenções de comportamento e suas notas.csv"))

for (item_da_lista in consultas_e_arquivos) {
    write.csv(eval(parse(text = item_da_lista[[1]])),
              file = item_da_lista[[2]],
              na = "",
              row.names = FALSE)}

## Imprimo o histograma e o padrão em uma imagem .png.  Você vai
## querer trocar `height' e `width' caso a função reclame de espaço
## vertical e horizontal insuficientes, respectivamente.
png(file = "Histograma e padrão das dimensões com observações de valores nulos.png",
           bg = "transparent",		   
           family = "NimbusSan",
           height = 1024,
           pointsize = 12 * 90 / 72,
           res = 90,
           width = 768)
aggr(as.data.frame(dados)[, c(letters[1:4],
                              letters[6:15])],
     cex.axis = 0.7,
     labels = names(dados)[c(1:4,
                             6:15)],
     numbers = TRUE,
     sortVars = TRUE,
     ylab = c("Histograma das dimensões com valores nulos",
              "Padrão"))
dev.off()
## Finaliza o arquivo .png.
